package cn.edu.ctbu.web.service;

import cn.edu.ctbu.web.dao.AdminCourse;
import cn.edu.ctbu.web.dao.AdminGrade;
import cn.edu.ctbu.web.domain.Admin;
import cn.edu.ctbu.web.mapper.CourseMapper;
import cn.edu.ctbu.web.mapper.GradeMapper;
import cn.edu.ctbu.web.repository.AdminRepository;
import cn.edu.ctbu.web.service.impl.IAdminService;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class AdminService implements IAdminService {
    @Autowired
    private AdminRepository adminRepository;

    @Resource
    CourseMapper courseMapper;
    @Autowired
    private GradeMapper gradeMapper;

    /**
     * 使用管理员编号+密码进行登录
     * @param no 管理员编号
     * @param password 密码
     * @return 与管理员编号和密码相匹配的管理员
     */
    public List<Admin> findByNoAndPassword(String no, String password){
        return adminRepository.findByNoAndPassword(no, password);
    }

    /**
     * 获取所有管理员信息——用于反强制进入主页
     * @return 所有管理员的信息
     */
    public List<Admin> findAllAdmin(){
        return adminRepository.findAll();
    }

    /**
     * 使用管理员编号查询管理员个人信息
     * @param no 管理员编号
     * @return 管理员个人信息
     */
    public Admin findByNo(String no){
        return adminRepository.findByNo(no);
    }

    /**
     * 所有课程的信息
     * @param pageable 分页参数对象，包含页码、每页大小等信息
     * @return 返回包含成绩信息的分页结果
     */
    public Page<AdminCourse> findAllCourse(Pageable pageable){
        // 获取所有符合条件的课程
        List<AdminCourse> allCourses = courseMapper.findAllCourse(pageable);

        // 获取总记录数
        long total = courseMapper.countAllCourse();

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allCourses.size());
        List<AdminCourse> pageContent = allCourses.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 获取所有成绩的信息
     * @param pageable 分页参数对象，包含页码、每页大小等信息
     * @return 返回包含课程信息的分页结果
     */
    public Page<AdminGrade> findAllGrade(Pageable pageable){
        List<AdminGrade> allGrades = gradeMapper.findAllGrade(pageable);
        // 获取总记录数
        long total = gradeMapper.countAllGrades();

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allGrades.size());
        List<AdminGrade> pageContent = allGrades.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

    /**
     * 新增课程表信息
     * @param cno 课程编号
     * @param cname 课程名称
     * @param tno 教师编号
     * @param credit 课程学分
     */
    public void insertCourseAdmin(@Param("cno") String cno, @Param("cname") String cname,
                           @Param("tno") String tno, @Param("credit") int credit){
        courseMapper.insertCourseAdmin(cno, cname, tno, credit);
    }


    /**
     * 更新课程表
     * @param cno 课程编号
     * @param cname 课程名称
     * @param tno 教师编号
     * @param credit 课程学分
     * @param id 课程id
     */
    public void updateCourseAdmin(@Param("cno") String cno, @Param("cname") String cname, @Param("tno") String tno,
                                  @Param("credit") int credit, @Param("id") int id){
        courseMapper.updateCourseAdmin(cno, cname, tno, credit, id);
    }


    public void deleteCourseAdmin(@Param("id") String id){
        courseMapper.deleteCourseAdmin(id);
    }

    /**
     *
     * @param cname
     * @param pageable
     * @return
     */
    public Page<AdminCourse> searchCourseAdmin(@Param("cname") String cname, Pageable pageable){
        // 获取所有符合条件的课程
        List<AdminCourse> allCourses = courseMapper.searchCourseAdmin(cname, pageable);

        // 获取总记录数
        long total = courseMapper.countSearchCourseAdmin(cname);

        // 手动进行分页
        int start = (int) pageable.getOffset();
        int end = Math.min((start + pageable.getPageSize()), allCourses.size());
        List<AdminCourse> pageContent = allCourses.subList(start, end);

        // 创建 Page 对象
        return new PageImpl<>(pageContent, pageable, total);
    }

}
